﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CPS1
{
    //kwantyzacja sygnały spróbkowanego (dyskretnego) wczytanego z pliku
    public class QuantizatedSignal : Signal //chyba lepiej jak po dyskretnym, zeby na pewno najpierw byla dyskretyzacja,to sie chyba akurat kupy nie trzyma...
    {
        public int b; //ilość bitów

        // konsruktor pobiera wartości sygnału z pliku
        //musi byc wydarzenie na przycisku, tak jak przy wczytywaniu sygnalu
        //musimy także przekazać liczbę bitów wybraną przez użytkowaniak, na razie jest wpisywane
        public QuantizatedSignal(Signal toCopy, int b)
        {
            this.periodical = false;
            this.discrete = true;
            this.name = toCopy.name; // nazwa sygnału
            this.A = toCopy.A; // amplituda
            this.T = toCopy.T; // okres sygnału (potrzebny wszędzie by nie było problemów z typem Signal
            this.t1 = toCopy.t1; // czas początkowy
            this.f = toCopy.f; //częstotliwość próbkowania
            this.d = (toCopy.calculatedValues.Length / 2) / toCopy.f; // czas trwania sygnalu, obliczamy z próbkowania i ilości próbek

            this.calculatedValues = new Double[toCopy.calculatedValues.Length / 2, 2];
            //musi być error na mniejsze od 0
            //tu jest ta stala tylko tymczasowo
            this.b = b;

            int quantizationLevel = (int)Math.Pow(2, b);

            Double startRange = toCopy.calculatedValues[0, 1];

            for (int i = 0; i < (toCopy.calculatedValues.Length / 2); i++)
            {
                if (startRange > toCopy.calculatedValues[i, 1])
                {
                    startRange = toCopy.calculatedValues[i, 1];
                }
            }

            Double endRange = toCopy.calculatedValues[0, 1];

            for (int i = 0; i < (toCopy.calculatedValues.Length / 2); i++)
            {
                if (endRange < toCopy.calculatedValues[i, 1])
                {
                    endRange = toCopy.calculatedValues[i, 1];
                }
            }

            //double quantizationThreshold = A / (quantizationLevel / 2);
            double quantizationThreshold = ((-1 * startRange) + endRange) / quantizationLevel;

            // kopiujemy wartości sygnału
            for (int i = 0; i < toCopy.calculatedValues.Length / 2; i++)
            {
                for (int j = 0; j < 2; j++)
                {
                    if (j == 0)
                    {
                        this.calculatedValues[i, j] = toCopy.calculatedValues[i, j];
                    }
                    else
                    {
                        //this.calculatedValues[i, j] = Math.Round(toCopy.calculatedValues[i, j] / quantizationThreshold);
                        this.calculatedValues[i, j] = Math.Round(toCopy.calculatedValues[i, j] / quantizationThreshold) * quantizationThreshold;
                    }
                }
            }
        }

        //tutaj trzbea po  prostu przepisac bo w konstruktorze on zmienia wartości i wyszłaby pętla
        //po co w zasadzie mamy go kopiowac?

        override public Double value(Double t)
        {
            return 0.0; // nie mam pojecia dlaczego musimy to implementowac
        }

        public override Signal copy()
        {
            return new QuantizatedSignal(this, 0);
        }

        public QuantizatedSignal copy2()
        {
            return new QuantizatedSignal(this, 0);
        }


    }
}
